package com.client.rule.decision;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.client.controller.EntryController;
import com.client.controller.NotNullTextBoxController;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.TextBox;

public abstract class DecisionEditorDialogBox extends DialogBox {
	
	protected boolean checked = false;	
	protected String label = "Nouvelle Decision";
	protected Button validateButton = new Button();	
	protected Button anullerBoutton = new Button();
	protected TextBox nomTextBox = new TextBox();
	protected HorizontalPanel panelButton = new HorizontalPanel();
	protected List<EntryController> listControllers = new ArrayList<EntryController>();
	
	public DecisionEditorDialogBox() {
		addController(new NotNullTextBoxController(nomTextBox, "Nom de la décision"));
		validateButton.setText("Valider");	
		anullerBoutton.setText("Annuler");
		anullerBoutton.addClickHandler(new ClickHandler() {
			
			public void onClick(ClickEvent event) {
				
				hide();		
			}
		});
		 validateButton.addClickHandler(new ClickHandler() {			
				public void onClick(ClickEvent event) {
					try{
						check();
						label = nomTextBox.getValue();				
						hide();
					}catch (IllegalArgumentException e) {
						Window.alert(e.getMessage());
					}
				}
		});
		panelButton.add(validateButton);
		panelButton.add(anullerBoutton);
	}
	
	
		
	
	/**
	 * @return the label
	 */
	public String getLabel() {
		return label;
	}
	/**
	 * Fermeture de la fenetre de dialogue
	 */
	public void hide(){
		super.hide();
	}
	
	/**
	 * Vérification des entrées de l'utilisateur
	 */
	public void check() throws IllegalArgumentException{
		checked = true;
		String errorMsg = "";	
		
		for(EntryController controller : listControllers){
			if(!controller.check()){
				checked = false;
				errorMsg = errorMsg+controller.getSource()+"\n";
			}
		}
	
		if(!checked){
			throw new IllegalArgumentException("Erreur :\n"+errorMsg);
		}
	}
	
	/**
	 * Ajout d'un controlleur d'entrées
	 * @param controller le {@link EntryController} à ajouter
	 */
	public void addController(EntryController controller){
		listControllers.add(controller);
	}
	/**
	 * Renvoie les informations nécessaire pour l'enregistrement XML
	 * @return Informations sous forme de Map(Nom attribut,valeur)
	 * @throws IllegalArgumentException
	 */
	public abstract Map<String,String>  getDecisionData() throws IllegalArgumentException;
	
	/**
	 * @return the validateButton
	 */
	public Button getValidateButton() {
		return validateButton;
	}
	
	/**
	 * @return the checked
	 */
	public boolean isChecked() {
		return checked;
	}	

	
}
